﻿using System;
using System.ComponentModel;
using DimensionsHelper.Common.Contracts.Excel.Options;
using DimensionsHelper.Common.TableFormatter;
using System.Text.Json.Serialization;

namespace DimensionsHelper.Common.Contracts.TableFormatter.Options;

[Serializable]
public class TableSectionFeature
{
    public string Left { get; set; } = string.Empty;
    public string Right { get; set; } = string.Empty;

    public override string ToString()
    {
        return Left + Right;
    }
}

[Flags]
[JsonConverter(typeof(JsonStringEnumConverter<TableGlobalOptionFlags>))]
public enum TableGlobalOptionFlags
{
    /// <summary>
    ///     抛弃此全局配置。
    /// </summary>
    [Description("无")]
    None = 0,

    /// <summary>
    ///     影响Section单元格样式。
    /// </summary>
    [Description("SECTION")]
    Section = 0x1,

    /// <summary>
    ///     影响Section成员单元格样式。
    /// </summary>
    [Description("SECTION成员")]
    SectionMember = 0x2,

    /// <summary>
    ///     影响标题单元格样式。
    /// </summary>
    [Description("标题单元格")]
    Title = 0x4,

    /// <summary>
    ///     影响表头单元格样式。
    /// </summary>
    [Description("表头单元格")]
    Header = 0x8,

    /// <summary>
    ///     影响表侧单元格样式。
    /// </summary>
    [Description("表侧单元格")]
    Side = 0x10,

    /// <summary>
    ///     影响数据单元格样式。
    /// </summary>
    [Description("数据单元格")]
    Data = 0x20,

    /// <summary>
    ///     影响表侧描述单元格样式。
    /// </summary>
    [Description("表侧描述单元格")]
    InnerText = 0x40,

    /// <summary>
    ///     影响Base值单元格。
    /// </summary>
    [Description("Base值单元格")]
    BaseValue = 0x80,

    /// <summary>
    ///     影响Base描述单元格。
    /// </summary>
    [Description("Base描述单元格")]
    BaseLabel = 0x100
}


[Serializable]
public class TableOptions : RangeStyleOptions
{
    /// <summary>
    ///     表格之间的间隔空白行数，如果不需要检测，设置为0。
    /// </summary>
    public int IntervalRows { get; set; }

    /// <summary>
    ///     指定内容Sheet中，表格标题的识别标记。此标记应是标题开头内容，一般情况下，应该是无意义字符，
    ///     否则，在<see cref="RemoveTitleFeature" />为true时，此内容将被移除。
    /// </summary>
    public string TitleFeature { get; set; } = TableFormatterDefaultValues.TableTitleFeature;

    /// <summary>
    ///     指定内容Sheet中，表格结束行的识别标记。此内容用于检测表格范围，此内容无法检测时，相关格式将无法添加。
    /// </summary>
    public string EndFeature { get; set; } = TableFormatterDefaultValues.TableEndFeature;

    /// <summary>
    ///     是否移除<see cref="TitleFeature" />的内容。
    /// </summary>
    public bool RemoveTitleFeature { get; set; }

    /// <summary>
    ///     表格中Base行的首列内容标记。
    /// </summary>
    public string BaseFeature { get; set; } = TableFormatterDefaultValues.BaseFeature;

    /// <summary>
    ///     是否出示读取标题的Section内容，同时需要配置了<see cref="SectionFeature" />。
    /// </summary>
    public bool ReadSection { get; set; }

    /// <summary>
    ///     表格Section的内容符号，此内容需要紧跟<see cref="TitleFeature" />之后，此内容只有在<see cref="ReadSection" />为true时才有用。
    /// </summary>
    public TableSectionFeature SectionFeature { get; set; } = new TableSectionFeature { Left = "[", Right = "]" };

    /// <summary>
    ///     是否出示已读取的Section内容，只有<see cref="ReadSection" />为true时才有用。
    /// </summary>
    public bool ShowSection { get; set; }
    
    /// <summary>
    ///     获取或设置全局字体样式的适用范围。
    /// </summary>
    public TableGlobalOptionFlags GlobalFontOptionFlag { get; set; } = TableGlobalOptionFlags.None;

    /// <summary>
    ///     获取或设置全局边框样式的适用范围。
    /// </summary>
    public TableGlobalOptionFlags GlobalBorderOptionFlag { get; set; } = TableGlobalOptionFlags.None;

    /// <summary>
    ///     表格首列宽度。
    /// </summary>
    public double FirstColumnWidth { get; set; } = TableFormatterDefaultValues.TableFirstColumnWidth;

    /// <summary>
    ///     表格除首列外的固定宽度，如果自适应匹配宽度，设置为0.
    /// </summary>
    public double FixedColumnWidth { get; set; } = TableFormatterDefaultValues.TableFixedColumnWidth;

    /// <summary>
    ///     获取或设置全局超链接文本样式。
    /// </summary>
    public FontStyleOptions HyperlinkStyleOptions { get; set; } = new FontStyleOptions();

    /// <summary>
    ///     获取或设置出示Section时的使用的单元格样式。
    /// </summary>
    public RangeStyleOptions SectionStyleOptions { get; set; } = new RangeStyleOptions();

    /// <summary>
    ///     获取或设置Section成员表格出示Section描述时的使用的单元格样式。
    /// </summary>
    public RangeStyleOptions SectionMemberStyleOptions { get; set; } = new RangeStyleOptions();

    /// <summary>
    ///     获取或设置表格标题单元格的字体样式。
    /// </summary>
    public RangeStyleOptions TitleStyleOptions { get; set; } = new RangeStyleOptions();

    /// <summary>
    ///     标题行行偏移数，正数为向上移动，负数为向下移动，最上不超过表头区域。
    /// </summary>
    public int TitleOffset { get; set; }

    /// <summary>
    ///     是否合并表格表头的交叉内容单元格。
    /// </summary>
    public bool MergeHeader { get; set; }

    /// <summary>
    ///     是否合并表格表头部分的空白行，只有在<see cref="RemoveHeaderEmptyRow" />为false时才有用。
    /// </summary>
    public bool MergeHeaderEmptyRow { get; set; }

    /// <summary>
    ///     是否移除表头部分的空白行。
    /// </summary>
    public bool RemoveHeaderEmptyRow { get; set; }

    /// <summary>
    ///     获取或设置表格表头单元格样式。
    /// </summary>
    public RangeStyleOptions HeaderStyleOptions { get; set; } = new RangeStyleOptions();

    /// <summary>
    ///     获取或设置表格表侧单元格样式。
    /// </summary>
    public RangeStyleOptions SideStyleOptions { get; set; } = new RangeStyleOptions();

    /// <summary>
    ///     添加表侧单元格背景颜色时是否跳过空白单元格。
    /// </summary>
    public bool SideColorIgnoreEmpty { get; set; }

    /// <summary>
    ///     获取或设置表格数据单元格样式。
    /// </summary>
    public RangeStyleOptions DataStyleOptions { get; set; } = new RangeStyleOptions();

    /// <summary>
    ///     获取或设置表侧中的文本行样式。
    /// </summary>
    public RangeStyleOptions InnerTextStyleOptions { get; set; } = new RangeStyleOptions();

    /// <summary>
    ///     获取或设置表格中的Base所在行样式。
    /// </summary>
    public RangeStyleOptions BaseValueStyleOptions { get; set; } = new RangeStyleOptions();

    /// <summary>
    ///     获取或设置表格中Base描述单元格样式。
    /// </summary>
    public RangeStyleOptions BaseLabelStyleOptions { get; set; } = new RangeStyleOptions();

    /// <summary>
    ///     获取或设置表格内的最大连续空白行数，如果不需要检测，设置为0。
    /// </summary>
    public int MaxEmptyRows { get; set; }

    /// <summary>
    ///     是否合并表头最左侧单元格。
    /// </summary>
    public bool MergeTopLeftCells { get; set; }

    /// <summary>
    ///     是否移除表格头部的系统信息。
    /// </summary>
    public bool RemoveHeaderSpec { get; set; }

    /// <summary>
    ///     是否移除表格末尾的系统信息。
    /// </summary>
    public bool RemoveTailSpec { get; set; }

    /// <summary>
    ///     是否校正表格末尾计数信息。
    /// </summary>
    public bool CorrectTableNumber { get; set; }

    /// <summary>
    ///     表格末尾计数信息标识字符。
    /// </summary>
    public string TableNumberFeature { get; set; } = TableFormatterDefaultValues.TableNumberFeature;

    /// <summary>
    ///     获取或设置表格末尾计数标识的格式，{0}表示当前计数，{1}表示表格总数。
    /// </summary>
    public string TableNumberFormat { get; set; } = TableFormatterDefaultValues.TableNumberFormat;
}